#include<iostream>
using namespace std;

class Animal {
  public:
   void speak() {
     cout<< "动物在说话"<< endl;
   }
};

class Cat : public Animal {
  public:
    void speak() {
      cout << "小猫在说话" << endl;
    }
};



// 地址早绑定，在编译阶段确定函数地址
void doSpeak(Animal &animal) {
  animal.speak();
}
// 那么上面这种情况怎么实现地址晚绑定呢？在Animal中使用虚函数，在运行阶段绑定
// class Animal {
//   public:
//    // 虚函数
//    virtual void speak() {
//      cout<< "动物在说话"<< endl;
//    }
// };

void test01() {
  Cat c1;
  doSpeak(c1);  // 动物在说话 // 父类的指针或者引用 指向子类对象
}

int main(){
  test01();
  return 0;
}
